package com.xci.sys.dao;

import com.github.pagehelper.Page;
import com.xci.core.internal.Const;
import com.xci.core.annotation.Paged;
import com.xci.sys.entity.SysRole;
import com.xci.sys.filter.RoleFilter;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * 角色数据层
 * @author 吕艳阳
 */
public interface RoleDao {
    /**
     * 新建角色
     * @param entity 角色对象
     * @return 返回影响的行数
     */
    Integer insert(@Param("entity") SysRole entity);

    /**
     * 修改角色
     * @param entity 角色对象
     * @return 返回影响的行数
     */
    Integer update(@Param("entity") SysRole entity);

    /**
     * 修改角色状态
     * @param id 角色主键
     * @param status 角色状态
     * @return 返回影响的行数
     */
    Integer updateStatus(@Param("id") String id, @Param("status") Boolean status);

    /**
     * 修改角色数据范围
     * @param id 角色主键
     * @param deptScope 角色数据范围
     * @return 返回影响的行数
     */
    Integer updateScope(@Param("id") String id, @Param("deptScope") Integer deptScope);

    /**
     * 删除角色
     * @param id 角色主键
     * @return 返回影响的行数
     */
    Integer delete(@Param("id") String id);

    /**
     * 检查主键是否存在
     * @param id 主键
     * @return 如果存在返回true, 否则返回false
     */
    Boolean existById(@Param("id") String id);

    /**
     * 检测是否存在指定机构主键的角色
     * @param deptId 机构主键
     * @return 如果存在返回true, 否则返回false
     */
    Boolean existByDeptId(@Param("deptId") String deptId);

    /**
     * 检测角色编码唯一性
     * @param code 角色编码
     * @param id 角色主键
     * @return 如果存在返回true, 否则返回false
     */
    Boolean existByCode(@Param("code") String code, @Param("id") String id);

    /**
     * 检查角色名称唯一性
     * @param deptId 机构主键
     * @param name 角色名称
     * @param id 角色主键
     * @return 如果存在返回true, 否则返回false
     */
    Boolean existByName(@Param("deptId") String deptId, @Param("name") String name, @Param("id") String id);

    /**
     * 查询单个角色
     * @param id 角色主键
     * @return 角色
     */
    SysRole selectById(@Param("id") String id);

    /**
     * 根据编码查询单个角色
     * @param code 角色编码
     * @return 返回角色对象
     */
    SysRole selectByCode(@Param("code") String code);

    /**
     * 查询角色列表
     * @param filter 过滤条件
     * @return 返回角色列表
     */
    List<SysRole> selectList(@Param("filter") RoleFilter filter);

    /**
     * 查询角色分页列表
     * @param filter 过滤条件
     * @return 返回角色分页列表
     */
    @Paged(defaultSortName = "r.path", defaultSortDir = Const.ASC)
    Page<SysRole> selectPageList(@Param("filter") RoleFilter filter);
}